﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Data.Linq;
using JPSOFTWARE.BON.Modelos;
using JPSOFTWARE.BON.Modelos.Interfaces;

namespace JPSOFTWARE.BON.DAL
{
    public class LoginDAL : BaseDAL, ILogin
    {

        readonly dbBONDataContext _dbBon = null;

        public LoginDAL()
        {
            _dbBon = new dbBONDataContext(StringConexao());
        }
        
        /// <summary>
        /// Propriedade que verifica se o usuário encontra-se logado.
        /// </summary>
        public static UsuarioModel UsuarioLogado
        {
            get
            {
                var Usuario = HttpContext.Current.Request.Cookies["UserCookieAuthentication"];
                if (Usuario == null)
                {
                    return null;
                }
                else
                {
                    string NovoToken = BON.Modelos.Criptografia.Descriptografar(Usuario.Value.ToString());

                    int IDUsuario;

                    if (int.TryParse(NovoToken, out IDUsuario))
                    {
                        return GetUsuarioByID(IDUsuario);
                    }
                    else
                    {
                        return null;
                    }
                }
            }
        }
        
        /// <summary>
        /// Recuperando o usuário pelo ID
        /// </summary>
        /// <param name="CodigoUsuario"></param>
        /// <returns></returns>
        public static UsuarioModel GetUsuarioByID(int CodigoUsuario)
        {
            dbBONDataContext contexto = new dbBONDataContext(StringConexao());

            var Consulta = (from usuario in contexto.TBL_USUARIOs
                            where usuario.COD_USUARIO == CodigoUsuario
                            select new
                            {
                                usuario.COD_USUARIO,
                                usuario.NM_USUARIO,
                                usuario.DS_EMAIL,
                                usuario.ST_ATIVO,
                                usuario.COD_TIPO_USUARIO,
                                usuario.ST_ATIVADO,
                                usuario.DT_ALTERACAO,
                                usuario.NM_APLICACAO
                            }).FirstOrDefault();

            UsuarioModel usuarioModel = new UsuarioModel
            {
                IdUsuario = Consulta.COD_USUARIO,
                Nome = Consulta.NM_USUARIO,
                Email = Consulta.DS_EMAIL,
                TipoUsuario = Consulta.COD_TIPO_USUARIO,
                Status = Consulta.ST_ATIVO == true ? "Ativo" : "Inativo",
                DataAlteracao = Consulta.DT_ALTERACAO
            };

            return usuarioModel;
        }

        /// <summary>
        /// Com base no Username e no Password, este método autentica o usuário e o direciona para o local correto.
        /// </summary>
        /// <param name="_Username">Email</param>
        /// <param name="_Password">Senha</param>
        /// <returns></returns>
        public Retorno AutenticarUsuario(string _Username, string _Password)
        {
            Retorno retorno = new Retorno();

            _Password = Criptografia.Criptografar(_Password);

            try
            {
                var RetornoQueryUser = (from u in _dbBon.TBL_USUARIOs
                                        where u.DS_EMAIL == _Username && u.DS_SENHA == _Password
                                        select u).FirstOrDefault();

                if (RetornoQueryUser.ST_ATIVO == false)
                {
                    retorno.Sucesso = false;
                    retorno.Mensagem = "Usuário Inativo. Entre em contato com a JPSoftware.";
                    return retorno;
                }

                else if (RetornoQueryUser.ST_ATIVADO == false)
                {
                    retorno.Sucesso = false;
                    retorno.Mensagem = "Sr. usuário(a) seu cadastro ainda não foi ativado. Por favor, verifique sua caixa de entrada de e-mail.";
                    return retorno;
                }

                else if (RetornoQueryUser == null)
                {
                    retorno.Sucesso = false;
                    return retorno;
                }


                else
                {
                    UsuarioModel usuarioModel = new UsuarioModel();
                    usuarioModel.IdUsuario = RetornoQueryUser.COD_USUARIO;
                    usuarioModel.Nome = RetornoQueryUser.NM_USUARIO;
                    usuarioModel.Email = RetornoQueryUser.DS_EMAIL;
                    usuarioModel.Senha = RetornoQueryUser.DS_SENHA;
                    usuarioModel.Status = RetornoQueryUser.ST_ATIVO == true ? "Ativo" : "Inativo";
                    usuarioModel.TipoUsuario = RetornoQueryUser.COD_TIPO_USUARIO;
                    usuarioModel.Ativado = RetornoQueryUser.ST_ATIVADO == true ? "Ativo" : "Inativo";
                    usuarioModel.DataAlteracao = RetornoQueryUser.DT_ALTERACAO;
                    usuarioModel.Aplicacao = RetornoQueryUser.NM_APLICACAO;

                    retorno.Objeto = usuarioModel;
                    retorno.Sucesso = true;

                    ////Criando um objeto cookie
                    //HttpCookie UserCookie = new HttpCookie("UserCookieAuthentication");

                    ////Setando o ID do usuário no cookie
                    //UserCookie.Value = BON.Modelos.Criptografia.Criptografar(RetornoQueryUser.COD_USUARIO.ToString());

                    ////Definindo o prazo de vida do cookie
                    //UserCookie.Expires = DateTime.Now.AddMinutes(10);

                    ////Adicionando o cookie no contexto da aplicação
                    //HttpContext.Current.Response.Cookies.Add(UserCookie);

                    //retorno.Sucesso = true;
                }
            }
            catch (Exception)
            {
                return retorno;
            }
            return retorno;
        }
        
        /// <summary>
        /// Verifica se realmente existe o email no banco de dados se existir, muda o estado de confirmado para True
        /// </summary>
        /// <param name="email"></param>
        /// <returns></returns>
        public bool VerificaConfirmacaoUsuario(string email)
        {
            bool retorno = false;
            try
            {
                var consulta = (_dbBon.TBL_USUARIOs.First(X => X.DS_EMAIL == email));

                if (consulta != null)
                {
                    consulta.ST_ATIVADO = true;
                    _dbBon.SubmitChanges();
                    retorno = true;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return retorno;
        }

        public bool AlterarSenha(AlterarSenhaModel alterarSenhaModel)
        {
            bool retorno = false;

            try
            {
                var consulta = _dbBon.TBL_USUARIOs.FirstOrDefault(x => x.COD_USUARIO.Equals(alterarSenhaModel.IdUsuario) &&
                    x.ST_ATIVO == true);

                if (consulta != null && consulta.DS_SENHA == Criptografia.Criptografar(alterarSenhaModel.SenhaAtual) && alterarSenhaModel.NovaSenha == alterarSenhaModel.ConfirmaSenha)
                {
                    consulta.DS_SENHA = Criptografia.Criptografar(alterarSenhaModel.NovaSenha);
                    consulta.DT_ALTERACAO = DateTime.Now;

                    _dbBon.SubmitChanges();

                    retorno = true;
                }

            }
            catch (Exception ex)
            {

                throw ex;
            }
            return retorno;
        }

        public string RecuperarSenha(string email)
        {
            string retorno = String.Empty;

            try
            {
                var consulta = _dbBon.TBL_USUARIOs.FirstOrDefault(x => x.DS_EMAIL == email);

                if (consulta != null)
                {
                    retorno = Criptografia.Descriptografar(consulta.DS_SENHA);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return retorno;
        }
    }
}
